package com.zh.juc.interrupt;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * @Author: zhanghuan
 * @date: 2022/10/10 19:07
 * @description: create it
 * 线程中断
 * <p>
 * interrupt 仅仅是设置线程的中断状态为true,发起协商不会立即停止线程
 * interrupted 静态方法 判断线程是否被中断并清除中断状态
 * 1.返回当前线程的中断状态，测试当前线程是否被中断
 * 2。将当前线程的中断状态清零并重新设置为false，清除线程的中断状态
 * isInterrupted 判断当前线程是否被中断（通过检查中断标志位）
 * <p>
 * 如何中断一个线程？
 * volatile
 * AtomicBoolean
 * 通过Thread api
 * 如何停止一个线程？
 */
public class InterruptDemo {
    // volatile 可见性，一个线程修改，另一个线程立即可见
    static volatile boolean isStop = false;
    //    static boolean isStop = false;
    static AtomicBoolean atomicBoolean = new AtomicBoolean(false);

    public static void main(String[] args) {
//        m1_volatile();
//        m2_automicBoolean();

        Thread t1 = new Thread(() -> {
            while (true) {
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println(Thread.currentThread().getName() + "\t isInterrupted()的值修改为true，程序停止");
                    break;
                }
                System.out.println("----------hello-----");
            }
        }, "t1");
        t1.start();

        System.out.println(t1.isInterrupted());

        try {
            TimeUnit.MILLISECONDS.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
//        new Thread(() -> {
//            t1.interrupt();
//        }, "t2").start();
        t1.interrupt();


    }

    private static void m2_automicBoolean() {
        new Thread(() -> {
            int i = 1;
            while (true) {
                if (atomicBoolean.get()) {
                    System.out.println(Thread.currentThread().getName() + "\t atomicBoolean的值修改为true，程序停止");
                    break;
                }

                System.out.println((i++) + "----------hello-----");
            }

        }, "t1").start();

        try {
            TimeUnit.MILLISECONDS.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            atomicBoolean.set(true);
        }, "t2").start();
    }

    private static void m1_volatile() {
        new Thread(() -> {
            int i = 1;
            while (true) {
                if (isStop) {
                    System.out.println(Thread.currentThread().getName() + "\t isStop的值修改为true，程序停止");
                    break;
                }

                System.out.println((i++) + "----------hello-----");
            }

        }, "t1").start();

        try {
            TimeUnit.MILLISECONDS.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            isStop = true;
        }, "t2").start();
    }
}
